﻿// *----------------------------------------------------------------
// Copyright (C) 2017 通通优品
// 版权所有。
// 
// 类名：UnitOfWorkOptions.cs
// 功能描述：TongTongMall
// 
// Create User：jym 2017/02/09
// 
// Edit User：UserName,EditTime
// Describe：Describe
// ----------------------------------------------------------------*/
using System;
using System.Collections.Generic;
using System.Transactions;

namespace TongTongMall.Domain.Uow
{
    public class UnitOfWorkOptions
    {
        /// <summary>
        /// 分布式事务配置项.
        /// </summary>
        public TransactionScopeOption? Scope { get; set; }

        /// <summary>
        /// 是否启用工作单元的事务模式
        /// </summary>
        public bool? IsTransactional { get; set; }

        /// <summary>
        /// 设置超时时间
        /// </summary>
        public TimeSpan? Timeout { get; set; }

        /// <summary>
        ///设置事务的操作等级，例如可读取脏数据等
        /// </summary>
        /// </summary>
        public IsolationLevel? IsolationLevel { get; set; }

        ///<summary>
        /// 分布式事务下启用跨线层可持久化的事务操作，默认为启用状态。
        /// </summary>
        public TransactionScopeAsyncFlowOption? AsyncFlowOption { get; set; }

        /// <summary>
        /// 每次工作单元内，启用或禁用某些过滤器
        /// </summary>
        public List<DataFilterConfiguration> FilterOverrides { get; private set; }

        public UnitOfWorkOptions()
        {
            FilterOverrides = new List<DataFilterConfiguration>();
        }

        internal void FillDefaultsForNonProvidedOptions(IUnitOfWorkDefaultOptions defaultOptions)
        {
            //子类没有配置默认的工作单元参数，则读取默认的配置
            if (!IsTransactional.HasValue)
            {
                IsTransactional = defaultOptions.IsTransactional;
            }

            if (!Scope.HasValue)
            {
                Scope = defaultOptions.Scope;
            }

            if (!Timeout.HasValue && defaultOptions.Timeout.HasValue)
            {
                Timeout = defaultOptions.Timeout.Value;
            }

            if (!IsolationLevel.HasValue && defaultOptions.IsolationLevel.HasValue)
            {
                IsolationLevel = defaultOptions.IsolationLevel.Value;
            }
        }
    }
}
